/**
 * SongController
 *
 * 主要职责：
 * - 歌曲管理：上传音频文件、编辑元数据、搜索、获取播放 URL
 *
 * 关键接口示例：
 * - Response uploadSong(MultipartFile file, SongDto dto)
 * - Response getSongUrl(Long songId)
 *
 * 依赖项：
 * - ISongService、MinioService
 *
 * 事务与错误处理：
 * - 上传到 Minio 成功后再写 DB；若 DB 写失败需做补偿或加入待清理队列
 *
 * 答辩要点：
 * - 文件存储策略和如何生成临时签名 URL（安全性）
 */
package net.zjitc.yqmusicserver.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import net.zjitc.yqmusicserver.domain.dto.SongDTO;
import net.zjitc.yqmusicserver.domain.vo.SongDetailVO;
import net.zjitc.yqmusicserver.domain.vo.SongVO;
import net.zjitc.yqmusicserver.result.PageResult;
import net.zjitc.yqmusicserver.result.Result;
import net.zjitc.yqmusicserver.service.ISongService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


import java.util.List;

@RestController
@RequestMapping("/song")
public class SongController {

    @Autowired
    private ISongService songService;

    /**
     * 获取所有歌曲
     *
     * @param songDTO songDTO
     * @return 歌曲列表
     */
    @PostMapping("/getAllSongs")
    public Result<PageResult<SongVO>> getAllSongs(@RequestBody @Valid SongDTO songDTO, HttpServletRequest request) {
        return songService.getAllSongs(songDTO, request);
    }

    /**
     * 获取推荐歌曲
     * 推荐歌曲的数量为 20
     *
     * @param request 请求
     * @return 推荐歌曲列表
     */
    @GetMapping("/getRecommendedSongs")
    public Result<List<SongVO>> getRecommendedSongs(HttpServletRequest request) {
        return songService.getRecommendedSongs(request);
    }

    /**
     * 获取歌曲详情
     *
     * @param songId 歌曲id
     * @return 歌曲详情
     */
    @GetMapping("/getSongDetail/{id}")
    public Result<SongDetailVO> getSongDetail(@PathVariable("id") Long songId, HttpServletRequest request) {
        return songService.getSongDetail(songId, request);
    }


}
